/*===============================================================================
 *
 *           这个demo展示  通过匿名管道实现管道符的作用
 *           实现 ps -ef | grep ssh
 *           ps -ef：这是一个程序，默认运行起来将结果打印到标准输出
 *           grep -ssh：这也是一个程序，默认允许起来从标准输入读取数据进行过滤
 *
 *==============================================================================*/

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wait.h>


int main()
{
  int pipefd[2] = {-1};
  if(pipe(pipefd)<0)
  {
    perror("pipe error");
    return -1;
  }
  pid_t ps_pid = fork();
  if(ps_pid == 0){
    //ps子进程
    dup2(pipefd[1],1);       //将标准输出重定向到管道写入端，向1写入数据就相当于向管道写入数据  
    execlp("ps","ps","-ef",NULL);
    exit(0);
  }
  pid_t grep_pid = fork();
  if(grep_pid == 0)
  {
    //grep子进程
    close(pipefd[1]);       //关闭写端：ps进程一旦退出，所有的写段被关闭，grep读完数据后返回0
    dup2(pipefd[0],0);      //将标准输入重定向到管道读取端，从0读取数据就相当于从管道读取数据
    execlp("grep","grep","pipe",NULL);
    exit(0);
  }

  close(pipefd[0]);
  close(pipefd[1]);
  waitpid(ps_pid,NULL,0);
  waitpid(grep_pid,NULL,0);

  return 0;

}
